﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Text;
using System.Windows;

namespace Pfz.WpfControls.TypeConverters
{
	/// <summary>
	/// Class that strings into GridLengths.
	/// </summary>
	public sealed class ObservableLengthsConverter:
		TypeConverter
	{
		private static readonly GridLengthConverter _converter = new GridLengthConverter();

		/// <summary>
		/// Returns true for string.
		/// </summary>
		public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
		{
			return sourceType == typeof(string);
		}

		/// <summary>
		/// Returns true for string.
		/// </summary>
		public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
		{
			return destinationType == typeof(string);
		}

		/// <summary>
		/// Convert from string.
		/// </summary>
		public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
		{
			string stringValue = value as string;
			if (stringValue == null)
				return null;

			var resultArray = FromString(stringValue);
			return new ObservableCollection<GridLength>(resultArray);
		}

		/// <summary>
		/// Convert to string.
		/// </summary>
		public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
		{
			if (destinationType != typeof(string))
				throw new ArgumentException("The only conversion supported is to string.", "destinationType");

			var enumerable = (IEnumerable<GridLength>)value;
			return ToString(enumerable);
		}

		/// <summary>
		/// Converts a string into an array of GridLengths.
		/// </summary>
		public static GridLength[] FromString(string lengths)
		{
			string[] split = lengths.Split(',');

			int length = split.Length;
			if (length == 0)
				return null;

			var result = new GridLength[length];
			for(int i=0; i<length; i++)
			{
				string trimmed = split[i].Trim();
				result[i] = (GridLength)_converter.ConvertFrom(trimmed);
			}

			return result;
		}

		/// <summary>
		/// Converts a collection of GridLengths to a string separated by comma.
		/// </summary>
		public static string ToString(IEnumerable<GridLength> lengths)
		{
			StringBuilder result = new StringBuilder();
			foreach(var length in lengths)
			{
				result.Append(length.ToString());
				result.Append(',');
			}
			
			if (result.Length == 0)
				return null;

			result.Length--;
			return result.ToString();
		}
	}
}
